package y2016.test;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

/**
 * 字符串学习
 */
public class StringStudy {

    private static class LazyHolder {
        private static final StringStudy INSTANCE = new StringStudy();
    }

    private StringStudy() {
    }

    /**
     * 获取实例
     *
     * @return
     */
    public static final StringStudy getInstance() {
        return LazyHolder.INSTANCE;
    }

    /**
     * StringReader类读取字符串，以字符为单位读取字符串。io流的一种
     *
     * @param str
     */
    public void useStringReader(String str) {
        StringReader sr = new StringReader(str);

        char[] ch = new char[8];
        int a = 0;
        try {
            while ((a = sr.read(ch)) != -1) {
                System.out.println(new String(ch, 0, a));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            sr.close();
        }
    }

    /**
     * 使用StringBufferInputStream读取字符串（一个字节一个字节的读取，遇到中文容易乱码）已过时
     */
    @SuppressWarnings("deprecation")
    public void useStringBufferInputStream(String s) {
        //		创建一个字符串输入流，以从指定字符串读取数据。
        //		参数：s - 基本输入缓冲区。
        java.io.StringBufferInputStream sbis = new java.io.StringBufferInputStream(s);
        byte[] b = new byte[32];

        try {
            sbis.read(b);
            System.out.println(new String(b));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                sbis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 使用StringWrite，输出字符串
     */
    public void useStringWriter(String str) {
        /* 一个字符流，可以用其回收在字符串缓冲区中的输出来构造字符串。
         * 关闭 StringWriter 无效。此类中的方法在关闭该流后仍可被调用，而不会产生任何 IOException。
         */
        StringWriter sw = new StringWriter();

        for (int i = 0; i < 5; i++) {
            sw.write(str);
        }
        System.out.println(sw);
    }

    /**
     * 使用StringBuffer(线程安全，速度慢一些)
     */
    public void useStringBuffer(String str) {
        StringBuffer sb = new StringBuffer();
        sb.append("\n\n使用StringBuffer类：\n" + str);
        System.out.println(sb);
    }

    /**
     * 使用StringBuilder(线程不够安全，速度比StringBuffer快)
     */
    public void useStringBuilder(String str) {
        StringBuilder sb = new StringBuilder(str);
        System.out.println("\n\n使用StringBuilder类：\n" + sb);
    }
}
